package ren.renshuaipeng.auth.web.controller;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import ren.renshuaipeng.auth.domain.auth.AuthUser;
import ren.renshuaipeng.auth.service.auth.AuthUserService;
import ren.renshuaipeng.auth.web.BaseController;
import ren.renshuaipeng.util.DateUtil;
import ren.renshuaipeng.util.ajax.AjaxDto;
import ren.renshuaipeng.util.anno.Token;
import ren.renshuaipeng.util.anno.log.OperatorLog;
import ren.renshuaipeng.util.anno.log.OperatorLogType;

/**
 * ClassName: AuthUserController<br/>
 * Function: . <br/>
 * Date: 2015/12/16 15:36<br/>
 *
 * @author 任帅鹏（作者）
 * @version V1.00 （版本号）
 * @see
 * @since JDK 1.8
 */
@Controller
@RequestMapping("/admin/user")
public class AuthUserController extends BaseController {

	private static final String USER_LIST_PAGE = "user/list";
	private static final String USER_FORM_PAGE = "user/form";

	@Autowired
	private AuthUserService authUserService;

	/**
	 * @Name: index
	 * @Description:
	 * @Author 任帅鹏（作者）
	 * @Version V1.00 （版本号）
	 * @Create Date: 2015-12-16 15:07:21（创建日期）
	 * @Parameters: [pageable, model]
	 * @Return java.lang.String
	 * @Throws
	 */
	@RequestMapping
	// @OperatorLog(getInfo="用户列表")
	public String index(Pageable pageable, Model model) {
		model.addAttribute("page", authUserService.findPage(pageable));
		return USER_LIST_PAGE;
	}

	/**
	 * @Name: savePage
	 * @Description:
	 * @Author 任帅鹏（作者）
	 * @Version V1.00 （版本号）
	 * @Create Date: 2015-12-16 16:01:47（创建日期）
	 * @Parameters: []
	 * @Return java.lang.String
	 * @Throws
	 */
	@RequestMapping(value = "/save")
	@Token(save = true)
	public String savePage(Model model) {
		model.addAttribute("action", "save");
		return USER_FORM_PAGE;
	}

	/**
	 * @Name: save
	 * @Description:
	 * @Author 任帅鹏（作者）
	 * @Version V1.00 （版本号）
	 * @Create Date: 2015-12-16 16:02:36（创建日期）
	 * @Parameters: [authUser]
	 * @Return ren.renshuaipeng.util.ajax.AjaxDto
	 * @Throws
	 */
	@RequestMapping(value = "/save", method = RequestMethod.POST)
	@Token(remove = true)
	@OperatorLog(getInfo = "新增用户", getType = OperatorLogType.SAVE)
	public String save(AuthUser authUser, RedirectAttributes redirectAttributes) {
		authUser.setCreateTime(DateUtil.getCurrentTime());
		authUserService.save(authUser, true);
		redirectAttributes.addFlashAttribute("info", new AjaxDto("添加成功"));
		return "redirect:/admin/user/save";
	}

	/**
	 * @Name: updatePage
	 * @Description:
	 * @Author 任帅鹏（作者）
	 * @Version V1.00 （版本号）
	 * @Create Date: 2015-12-16 16:02:55（创建日期）
	 * @Parameters: []
	 * @Return java.lang.String
	 * @Throws
	 */
	@RequestMapping(value = "/update/{id}")
	@Token(save = true)
	public String updatePage(@PathVariable("id") String id, Model model) {
		model.addAttribute("action", "update");
		model.addAttribute("user", authUserService.findOne(id));
		return USER_FORM_PAGE;
	}

	/**
	 * @Name: update
	 * @Description:
	 * @Author 任帅鹏（作者）
	 * @Version V1.00 （版本号）
	 * @Create Date: 2015-12-16 16:03:06（创建日期）
	 * @Parameters: [authUser]
	 * @Return java.util.Map
	 * @Throws
	 */
	@RequestMapping(value = "/update", method = RequestMethod.POST)
	@Token(remove = true)
	@OperatorLog(getInfo = "编辑用户", getType = OperatorLogType.UPDATE)
	public String update(@ModelAttribute("user") AuthUser authUser, RedirectAttributes redirectAttributes) {
		authUserService.save(authUser, false);
		redirectAttributes.addFlashAttribute("info", new AjaxDto("编辑成功"));
		return "redirect:/admin/user/update/" + authUser.getId();
	}

	/**
	 * 所有RequestMapping方法调用前的Model准备方法, 实现Struts2
	 * Preparable二次部分绑定的效果,先根据form的id从数据库查出User对象,再把Form提交的内容绑定到该对象上。
	 * 因为仅update()方法的form中有id属性，因此仅在update时实际执行.
	 */
	@ModelAttribute
	public void getUser(@RequestParam(value = "id", defaultValue = "") String id, Model model) {
		if (StringUtils.isNoneBlank(id)) {
			model.addAttribute("user", authUserService.findOne(id));
		}
	}

	/**
	 * @Name: delete
	 * @Description:
	 * @Author 任帅鹏（作者）
	 * @Version V1.00 （版本号）
	 * @Create Date: 2015-12-16 16:03:14（创建日期）
	 * @Parameters: [id]
	 * @Return java.util.Map
	 * @Throws
	 */
	@RequestMapping(value = "/delete/{id}", method = RequestMethod.POST)
	@ResponseBody
	@OperatorLog(getInfo = "删除用户", getType = OperatorLogType.DELETE)
	public AjaxDto delete(@PathVariable("id") String id) throws Exception {
		authUserService.delete(id);
		return new AjaxDto();
		// throw new SQLException("1");
	}
}